#ifndef HASH_HPP
#define HASH_HPP

#include <iomanip>
#include <openssl/evp.h>
#include <sstream>
#include <string>
#include <vector>

namespace tools {

inline std::string calculateHash(const std::string &input) {
  // 使用OpenSSL的EVP接口计算SHA-256哈希值
  unsigned char hash[EVP_MAX_MD_SIZE];
  unsigned int hash_len;

  EVP_MD_CTX *ctx = EVP_MD_CTX_new();
  EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr);
  EVP_DigestUpdate(ctx, input.c_str(), input.size());
  EVP_DigestFinal_ex(ctx, hash, &hash_len);
  EVP_MD_CTX_free(ctx);

  // 将哈希值转换为十六进制字符串
  std::stringstream ss;
  for (unsigned int i = 0; i < hash_len; ++i) {
    ss << std::hex << std::setw(2) << std::setfill('0')
       << static_cast<int>(hash[i]);
  }

  return ss.str();
}

inline bool verifyHash(const std::string &input, const std::string &hash) {
  return calculateHash(input) == hash;
}

} // namespace tools

#endif // HASH_HPP